#ifndef _VL_C_CONFIG_DEF__H_
#define _VL_C_CONFIG_DEF__H_


#include <memory>
#include "support/vl_flag.h"
#include "support/vl_valid.h"
#include "support/vl_container.h"

namespace VL {

/**
 * @Author: CimZzz
 * @Date: 2022-08-19 18:57:14
 * 
 * C / C++ 文件类型枚举
 */
enum CFileType {
	// C 源文件
	CFT_C = 0x1,
	// C++ 源文件
	CFT_CPP = 0x2,
	// C / C++ 头文件
	CFT_H = 0x4,
	// C / C++ 目标文件
	CFT_O = 0x8,
	// C / C++ 可执行文件
	CFT_EXEC = 0x10,
	// C / C++ 动态库文件
	CFT_DYM = 0x20,
	// C / C++ 静态库文件
	CFT_STATIC = 0x40,
	// C / C++ 测试用例文件
	CFT_TEST = 0x80
};

/**
 * @Author: CimZzz
 * @Date: 2022-08-19 18:16:14
 * 
 * C / C++ 远程依赖库数据集
 */
struct CRemoteDependencyBundle {
	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-20 18:09:00
	 * 
	 * 依赖库名
	 */
	std::string name;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 18:16:37
	 * 
	 * 获取方式
	 */
	std::string method;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 18:17:03
	 * 
	 * 获取路径
	 */
	std::string path;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 18:17:41
	 * 
	 * 额外信息
	 */
	std::string extraInfo;
};

/**
 * @Author: CimZzz
 * @Date: 2022-08-19 17:08:19
 * 
 * C / C++ 测试用例数据集
 */
struct CTestBundle {
	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-23 00:47:53
	 * 
	 * 是否缺失依赖库
	 */
	bool dismissDep = false;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-20 17:53:05
	 * 
	 * 测试用例名
	 */
	std::string name;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-08 11:53:38
	 * 
	 * 测试用例描述
	 */
	std::string desc;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 17:00:44
	 * 
	 * C / C++ 编译参数
	 */
	VLFlag COMPILE_FLAGS;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 17:02:00
	 * 
	 * C Pre-Process 参数
	 */
	VLFlag CPPFLAGS;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 17:01:05
	 * 
	 * 链接参数
	 */
	VLFlag LDFLAGS;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 17:09:25
	 * 
	 * 待生成的测试用例文件指针
	 */
	std::shared_ptr<FileWrapper> testFilePtr;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-11-11 18:41:09
	 * 
	 * 判断是否为自检查测试用例
	 */
	bool isCheckItem = false;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-11-11 11:35:00
	 * 
	 * 用于校验的测试用例参数列表
	 */
	std::shared_ptr<std::vector<std::string>> passParamsList;
};

/**
 * @Author: CimZzz
 * @Date: 2022-08-19 17:00:21
 * 
 * C / C++ 可执行文件数据集
 */
struct CExecutableBundle {
	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-23 00:47:53
	 * 
	 * 是否缺失依赖库
	 */
	bool dismissDep = false;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-20 17:03:54
	 * 
	 * 可执行项目名称
	 */
	std::string name;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 17:01:05
	 * 
	 * 链接参数
	 */
	VLFlag LDFLAGS;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 17:09:25
	 * 
	 * 待生成的可执行文件指针
	 */
	std::shared_ptr<FileWrapper> executableFilePtr;
};

/**
 * @Author: CimZzz
 * @Date: 2022-08-19 17:11:09
 * 
 * C / C++ 库文件数据集
 */
struct CLibraryBundle {
	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-23 00:47:53
	 * 
	 * 是否缺失依赖库
	 */
	bool dismissDep = false;
	
	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-20 17:03:40
	 * 
	 * 库项目名称
	 */
	std::string name;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 17:01:05
	 * 
	 * 链接参数
	 */
	VLFlag LDFLAGS;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-22 08:20:15
	 * 
	 * 库校验文件
	 */
	std::shared_ptr<ValidFile> libraryTsFile;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 17:09:25
	 * 
	 * 待生成的动态库文件指针
	 */
	std::shared_ptr<FileWrapper> dynamicFilePtr;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 17:12:22
	 * 
	 * 待生成的静态库文件指针
	 */
	std::shared_ptr<FileWrapper> staticFilePtr;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 17:12:22
	 * 
	 * 待生成的位置无关静态库文件指针
	 */
	std::shared_ptr<FileWrapper> nopStaticFilePtr;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 17:13:29
	 * 
	 * 头文件列表指针
	 */
	std::vector<std::shared_ptr<FileWrapper>> headerFileListPtr;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-22 09:14:43
	 * 
	 * 需要拷贝的文件列表指针
	 */
	std::shared_ptr<std::vector<std::shared_ptr<FileWrapper>>> needCopyFileListPtr;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-22 09:14:43
	 * 
	 * 需要移除的文件列表指针
	 */
	std::shared_ptr<std::vector<std::shared_ptr<FileWrapper>>> needRemoveFileListPtr;
};

/**
 * @Author: CimZzz
 * @Date: 2022-08-19 17:18:31
 * 
 * C / C++ 工具链数据集
 */
struct CToolchainBundle {
	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 17:18:49
	 * 
	 * C Compiler
	 */
	std::string CC;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 17:18:58
	 * 
	 * C++ Compiler
	 */
	std::string CXX;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 17:20:02
	 * 
	 * Archive
	 */
	std::string AR;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 17:20:22
	 * 
	 * RANLIB
	 */
	std::string RANLIB;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 17:20:41
	 * 
	 * System Root
	 */
	std::string SYSROOT;
};

/**
 * @Author: CimZzz
 * @Date: 2022-08-19 15:31:47
 * 
 * C / C++ 配置参数集合
 */
struct CConfigBundle {
	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-20 17:12:14
	 * 
	 * 配置切面
	 */
	uint32_t aspect = 0;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 17:18:49
	 * 
	 * C Compiler
	 */
	std::string CC;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 17:18:58
	 * 
	 * C++ Compiler
	 */
	std::string CXX;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 17:20:02
	 * 
	 * Archive
	 */
	std::string AR;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 17:20:22
	 * 
	 * RANLIB
	 */
	std::string RANLIB;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 17:20:41
	 * 
	 * System Root
	 */
	std::string SYSROOT;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 17:00:44
	 * 
	 * C 编译参数
	 */
	VLFlag CFLAGS;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 17:00:54
	 * 
	 * C++ 编译参数
	 */
	VLFlag CXXFLAGS;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 17:02:00
	 * 
	 * C Pre-Process 参数
	 */
	VLFlag CPPFLAGS;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-20 17:58:48
	 * 
	 * 源文件池
	 */
	std::shared_ptr<FilePool> sourceFilePool = std::shared_ptr<FilePool>(new FilePool);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-20 17:58:56
	 * 
	 * 测试源文件池
	 */
	std::shared_ptr<FilePool> testSourceFilePool = std::shared_ptr<FilePool>(new FilePool);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-20 17:59:04
	 * 
	 * 测试目标文件池
	 */
	std::shared_ptr<FilePool> testTargetFilePool = std::shared_ptr<FilePool>(new FilePool);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-20 17:59:04
	 * 
	 * 目标文件池
	 */
	std::shared_ptr<FilePool> targetFilePool = std::shared_ptr<FilePool>(new FilePool);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-20 17:59:14
	 * 
	 * 位置无关文件池
	 */
	std::shared_ptr<FilePool> libTargetFilePool = std::shared_ptr<FilePool>(new FilePool);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-20 17:59:22
	 * 
	 * 头文件池
	 */
	std::shared_ptr<FilePool> headerFilePool = std::shared_ptr<FilePool>(new FilePool);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 18:18:44
	 * 
	 * 远程依赖配置列表指针
	 */
	std::shared_ptr<std::vector<std::shared_ptr<CRemoteDependencyBundle>>> remoteDependenciesPtr;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-19 19:53:21
	 * 
	 * 可执行项目列表指针
	 */
	std::shared_ptr<std::vector<std::shared_ptr<CExecutableBundle>>> execBundlesPtr;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-20 17:02:51
	 * 
	 * 库项目列表指针
	 */
	std::shared_ptr<std::vector<std::shared_ptr<CLibraryBundle>>> libBundlesPtr;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-20 17:54:58
	 * 
	 * 测试项目列表指针
	 */
	std::shared_ptr<std::vector<std::shared_ptr<CTestBundle>>> testBundlesPtr;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-20 17:54:58
	 * 
	 * 待检测的列表指针
	 */
	std::shared_ptr<std::vector<std::shared_ptr<CTestBundle>>> checkTestBundlesPtr;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-10-24 17:16:06
	 * 
	 * 特性描述列表指针
	 */
	std::shared_ptr<std::unordered_map<std::string, std::string>> featureDescsPtr;
};

}

#endif // _VL_C_CONFIG_DEF__H_
